AIGC 和低代码结合应用全栈研发实践总结 | 得物技术
目录
一、背景
二、思考
三、具象思考
四、对低代码的“吐槽”
五、主要方案设计
1. 简化组件配置
2. 高效初始化页面
2.1 通过页面模版初始化
2.2 通过接口元数据生成页面
2.3 根据 PRD 描述快速生成页面
3. 智能答疑
六、大模型训练和应用
七、我对大模型应用研发提效的看法
八、功能架构图
九、问题和规划
十、参考
一
背景
电商供应链的系统建设一般偏向于数据管理类型,但此类系统建设有一个很明显的问题就是前后端开发的沟通成本较高(相对研发成本而言),特别是一些简单加减字段的诉求沟通成本甚至达到 50% 以上,如何将这部分沟通成本降低下来,并保证高质量的交付成为目前亟待解决的问题。
经过对需求和系统页面进行分析,我们得出如下数据:
供应链 ≤ 2 人日的需求投入工时占接近 50%,两周的迭代周期,一个前端甚至能接到 10+ 需求,时间碎片化特别严重,而这些需求很简单,基本就是一些字段的加减处理,单选改多选,增加导入导出等等。
供应链七成页面属于标准的列表类型,也就是我们常说的(CQUD),这种页面的特点就是交互简单、功能标准,我们常见的功能包括:查询、新建、编辑、批量处理、上下线/删除、导入/导出、查看操作日志、查看详情等。
二
思考
即所谓的契约精神问题,什么时间交付接口描述,并且描述清晰?在现实环境中,这是一个比较难达成的事情。服务端什么时候能够上传接口说明,这个时间不确定,即使确定了,也会出现因为各种因素不符合预期,因为很多情况下一个接口和属性的描述他认为描述清楚了,并不代表你能理解,这个就是信息差,但是真要做到你能够理解服务端一定会付出更多成本,有些人会认为没必要。 服务端会修改出入参格式而忘记沟通,可能到了比较滞后的联调甚至测试阶段才发现,而且屡禁不止。
三
具象思考
源码和低码学习成本趋势图
低代码和几种跨界工具的学习成本对比
阿里低代码引擎:https://lowcode-engine.cn/index 强调可视化配置生成页面; 百度 Amis:https://aisuda.bce.baidu.com/amis/zh-CN/docs/index 强调 JSON 配置生成页面。
Amis JSON 配置能力更加强大,相对于 Lowcode Engine 需要写很多脚本来满足稍微复杂的场景,JSON 配置的学习成本更低,更适合服务端同学快速上手; Amis 的文档功能更加强大,可以直接编辑 JSON 查看修改后的结果,这一步可以极大的方便开发学习 API。
四
对低代码的“吐槽”
没有认清使用人群:B 端低代码产品的绝大部分用户是前端,专业人士用低代码多少有点抵触情绪的,给别人用之前一定要想清楚,他为什么会用?或者说他因为什么才会用?个人认为给前端提供低代码工具做 B 端系统,大概率是行不通的,也许会有效率提升,但是相对专业降级及蹩脚研发体验可能不值一提。 灵活性不足:当遇到某种逻辑的时候,用起来就会很蹩脚或者根本没法做下去,正所谓 “一行代码难倒英雄汉”,只能源码开发一遍,这种不断尝试后的返工确实会让体验大大降低,这种一般受组件不支持或者低代码引擎不支持影响。 功能不完备:其实做好一个页面,要考虑多方面问题:联调、页面管理、发布/回滚、菜单、权限等,这些是不是都考虑在内了,那种体验割裂,流程分散在各个平台的方式一定会被吐槽的。 缺乏设计理念:比如常用组件的一种配置有多种属性命名方式,还有就是功能实现不符合大众认知等等,导致 API 的理解和学习成本巨大。 认知成本高:比如我们目前服务端全栈的场景,他们甚至不知道组件的概念,也不知道所谓的数据驱动,拿到的 PRD 对于页面的描述很有可能只是一大段文字描述,连个像样的线框图都没有,对于一个新手如何做才能还原成和标准交互一样的页面,其实是一个很大的考验,这些细节都是我们需要考虑并解决的。
五
主要方案设计
简化组件配置
选择显示姓名,姓名展示,选择禁用密码,姓名隐藏,密码禁用
import React, { useState } from 'react';
import { Radio, Form, Input } from 'antd';
type FieldType = {
username?: string;
password?: string;
type?: number;
};
const App: React.FC = () => {
const [form] = Form.useForm();
const [hiddenName, setHiddenName] = useState(false);
const [diablePassword, setDiablePassword] = useState(false);
const onValuesChangeHandler = (values: FieldType) => {
setHiddenName(values.type !== 1);
setDiablePassword(values.type === 2);
};
return (
<Form
form={form}
name="basic"
labelCol={{ span: 8 }}
wrapperCol={{ span: 16 }}
style={{ maxWidth: 600 }}
onValuesChange={onValuesChangeHandler}
autoComplete="off"
>
<Form.Item<FieldType> name="type" wrapperCol={{ offset: 8, span: 16 }}>
<Radio.Group>
<Radio value={1}>显示姓名</Radio>
<Radio value={2}>禁用密码</Radio>
</Radio.Group>
</Form.Item>
{!hiddenName && (
<Form.Item<FieldType> label="姓名" name="username">
<Input />
</Form.Item>
)}
<Form.Item<FieldType> label="密码" name="password">
<Input.Password disabled={diablePassword} />
</Form.Item>
</Form>
);
};
export default App;
{
"type": "form",
"body": [
{
"type": "radio",
"name": "type",
"label": "类型",
"options": [
{
"label": "显示姓名",
"value": 1
},
{
"label": "禁用密码",
"value": 2
}
]
},
{
"type": "text",
"name": "username",
"label": "姓名",
"visibleOn": "${type == 1}"
},
{
"type": "password",
"name": "password",
"label": "密码",
"disabledOn": "${type == 2}"
}
]
}
//adaptor 脚本生成 prompts
你扮演一个纯函数代码生成器,你负责生成数据格式转换代码,你负责接收函数出入参的文本指令,根据要求生成javascript 代码,取变量值和给变量赋值的时候请做好容错处理,处理容错时不要提前返回undefined或null
帮我生成一个 js 函数: function formatData(payload, response, api) {},要求最终返回处理好的数据
response参数: ${before},
返回数据为: ${target},
只输出函数代码,不要输出其他无关的东西,函数代码中的注释保持中文输出,其他无关信息不要输出
输出代码缩进2个空格
高效初始化页面
通过页面模版初始化
通过接口元数据生成页面
根据 PRD 描述快速生成页面
智能答疑
快速了解某个组件怎么使用或者概念; 复杂的表单联动关系; 根据需求生成或者修改页面结构; 帮你理解页面配置。
六
大模型训练和应用
根据文档中的组件示例、组件 API 描述、概念描述、示例、存储的 QA 问题等快速生成种子问题。 Proto 和智能答疑的正负向反馈都会被作为训练数据放入种子问题中。 种子问题数量有限(1000 以内),所以会进过一轮人工的验证,比如你如果发现 SearchPage 组件相关的问答不够准确,可以搜索处理对种子问题进行矫正,如下是一个简单的种子问题校准工具。
针对种子问题通过成熟大模型进行扩展生成多条问题,这一步可以实现数据集的成倍增长,也是为了兼容对一个问题不同的表达,提升模型对问题的兼容度,主要扩展思路如下: 问题扩充,同一个问题换说法; 根据答案生成问题。
对训练模型准确度进行综合评估,因为上面提到的智能答疑和 Proto 都会有正负反馈,也能部分说明模型准确性,更精细的准确度评估我们目前还没有做,如果要做的话可以参考 Ragas 评估(https://zhuanlan.zhihu.com/p/675777378),针对整理的数据集可以留一部分 QA 不参与训练,而是用于做准确度评估即可。
综合流程整理如上
七
我对大模型应用研发提效的看法
有用,但适可而止:以上五种应用场景中的三种都起到了一定的作用,并且我们还在考虑通过大模型实现数据 Mock 能力,因为他足够聪明,只要我们把上下文数据和 type Interface 全部给他,可以用比较低的成本实现CQUD 的接口,但每一种应用在我们的方案设计里面,都不是必经路径,核心是因为在研发这条路上,模型的准确率没有想象那么高,很多情况下需要人为纠正,这个也是我们实践下来的一个最明显的认知,不要想着把大模型训练的特别牛,准确率特别高,ROI 不一定合理,从辅助研发的角度,我认为能达到 70% 以上已经是非常了不起了(Wizard 大模型目前准确率 60%),除非你们成立了一个专业团队,长时间投入。
增强针对性:很多情况下太泛的应用会影响大模型的准确度,我们在实际场景中可以结合严谨的 prompts 和 TypeChat 这种工具,缩小大模型回答的范围,因为你指向越明确,大模型回答的越精确,像上面提到的用于数据格式转换的脚本生成,一般很少会出问题,除非站在人的角度没法理解你要转换的意图,那就是你的输入有问题了。
不要逃避:个人认为 AIGC 一定是未来趋势,各行各业可能都会发生变革,包括研发,一味地按照固有思维去解决问题或者不愿去了解,未来大概率会吃亏的,你不一定要自己学会怎么训练大模型,但最起码要掌握两点:大模型的成长性新闻以及应用场景。个人认为,未来简单页面的开发工作可能真的会被生成式 AI 替代,如果你现在的工作就是在做类似简单 CQUD 的事情,那一定要焦虑一下了,快去多翻翻社区。一个很现实的例子:“十年梦碎,苹果放弃造车转 AI”,不造车可以理解成对新能源不看好或者认为已经很饱和,但是转生成式AI,这个一定是对未来的深刻信心和期许。
八
功能架构图
功能架构图
九
问题和规划
Proto 和 智能答疑的应用占比不高,组件 API 查看率 70%,这个评估下来和准确度还是有比较大关系,针对这个问题我们做的是从 JSON 配置往可视化配置进行转换,尽量减少大家的认知成本。 通过智能答疑和 Proto 的正负向反馈,不断训练模型,提升其准确度,最起码要做到 70%。 增强 Proto 的配置能力,提升产品同学使用 Proto 输出页面的比例,争取做到 PRD 阶段输出 UI,进一步提升页面输出效率。 提供产品能够理解的可视化配置版本,实现在业务系统上可以直接进入配置界面创建需求,从原来的截图说明需求,变成直接配置生成草稿和变更说明,并和得物的需求创建流转流程关联起来,进一步降低一个需求从需求到上线各个角色参与的成本,缩短需求交付周期。
需求提出流程
需求评估和交付流程
十
参考
往期回顾
文 / Steven
关注得物技术,每周一、三、五更新技术干货
要是觉得文章对你有帮助的话,欢迎评论转发点赞~
未经得物技术许可严禁转载,否则依法追究法律责任。
“
扫码添加小助手微信
如有任何疑问,或想要了解更多技术资讯,请添加小助手微信:
线下活动推荐